package com.bjpowernode.controller;

import com.bjpowernode.entity.TActivity;
import com.bjpowernode.entity.TUser;
import com.bjpowernode.query.ActivityQuery;
import com.bjpowernode.query.UserQuery;
import com.bjpowernode.result.Result;
import com.bjpowernode.service.ActivityService;
import com.bjpowernode.service.UserService;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * 活动管理控制器
 * 负责处理与活动相关的HTTP请求，包括活动列表查询、创建、更新和删除等操作
 */
@RestController
public class ActivityController {
    /**
     * 活动服务接口实例
     * 用于调用活动相关的业务逻辑方法
     */
    @Resource
    private ActivityService activityService;

    /**
     * 获取活动列表的分页接口
     * 使用GET请求方式，请求路径为/api/activities
     * @param current 当前页码，从1开始
     * @return Result对象，包含分页信息（PageInfo<TActivity>）的成功响应
     */
    @GetMapping("/api/activities")
    public Result getActivities(Integer current, ActivityQuery activityQuery) {
        // 调用用户服务获取分页数据
        PageInfo<TActivity> pageInfo = activityService.getActivityByPage(current, activityQuery);
        // 返回成功响应，包含分页信息
        return Result.OK(pageInfo);
    }

    /**
     * 根据活动ID获取活动详情接口
     *
     * @param id 活动ID，路径参数
     * @return Result 包含活动详情数据的响应对象
     * @apiNote 该接口需要用户已登录，根据ID查询并返回单个活动的完整信息
     * @see ActivityService#getActivityById(Integer) 活动服务层的详情查询方法
     */
    @GetMapping("/api/activity/{id}")
    public Result getActivityById(@PathVariable Integer id) {
        // 调用活动服务根据ID查询活动详情
        TActivity tActivity = activityService.getActivityById(id);
        // 返回成功响应，包含活动详情
        return Result.OK(tActivity);
    }

    /**
     * 活动注册接口
     *
     * @param activityQuery 活动注册信息查询对象，包含活动名称、开始时间、结束时间、预算、描述等必要信息
     * @return Result 包含影响行数的响应对象，1表示成功，0表示失败
     * @apiNote 该接口无需登录即可访问，用于新活动注册
     * @see ActivityService#addActivity(ActivityQuery) 活动服务层的添加活动方法
     */
    @PostMapping("/api/activity")
    public Result addActivity(@Valid ActivityQuery activityQuery) {
        // 调用活动服务添加新用户
        int count = activityService.addActivity(activityQuery);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 活动信息编辑接口
     *
     * @param activityQuery 活动编辑信息查询对象，包含活动ID及待更新字段
     * @return Result 包含影响行数的响应对象，1表示成功，0表示失败
     * @apiNote 该接口需要登录后访问，用于已注册活动更新活动信息
     * @see ActivityService#editActivity(ActivityQuery) 活动服务层的编辑活动方法
     */
    @PutMapping("/api/activity")
    public Result editActivity(@Valid ActivityQuery activityQuery) {
        // 调用活动服务编辑用户信息
        int count = activityService.editActivity(activityQuery);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 活动删除接口
     *
     * @param id 活动唯一标识符，通过URL路径传递
     * @return Result 包含影响行数的响应对象，1表示成功，0表示失败或活动不存在
     * @apiNote 该接口需要管理员权限才能访问，用于删除指定ID的活动
     * @see ActivityService#deleteActivity(Integer) 活动服务层的删除活动方法
     */
    @DeleteMapping("/api/activity/{id}")
    public Result deleteActivity(@PathVariable Integer id) {
        // 调用活动服务删除指定ID的活动
        int count = activityService.deleteActivity(id);
        // 返回成功响应，包含影响行数
        return count == 1 ? Result.OK(count) : Result.FAIL();
    }

    /**
     * 活动批量删除接口
     * 使用DELETE请求方式，请求路径为/api/activities
     * @param ids 活动ID字符串，多个ID使用逗号分隔（例如："1,2,3"）
     * @return Result对象，包含以下两种可能结果：
     *         - 成功：状态码为成功标识，data字段为删除的活动数量
     *         - 失败：状态码为失败标识，无data字段
     */
    @DeleteMapping("/api/activities")
    public Result deleteActivities(@RequestParam("ids") String ids) {
        // 将逗号分隔的活动ID字符串转换为List集合
        List<String> list = Arrays.asList(ids.split(","));
        // 调用活动服务层批量删除活动，返回实际删除的数量
        int count = activityService.deleteActivities(list);
        // 返回成功响应，包含删除的活动数量
        // 如果实际删除数量等于请求删除数量，则返回成功；否则返回失败
        return count == list.size() ? Result.OK(count) : Result.FAIL();
    }
}
